package com.mmall.demo2.common.redis;

import com.mmall.demo2.utils.PropertiesUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @Author: jiaru
 * @Description: redis 连接池封装类：1.构建连接池； 2. 封装连接池操作
 * @Date: Created on 2018/6/28
 * @Modify:
 */
public class RedisPool {

    // jedis连接池
    private static JedisPool pool;

    // 最大连接数
    private static Integer maxTotal =
            Integer.valueOf(PropertiesUtil.getProperty("redis.max.total", "20"));
    // 最大空闲数
    private static Integer maxIdle =
            Integer.valueOf(PropertiesUtil.getProperty("redis.max.idle", "10"));
    // 最小空闲数
    private static Integer minIdle =
            Integer.valueOf(PropertiesUtil.getProperty("redis.min.idle", "2"));
    // borrow一个jedis实例时，是否进行验证操作，如果赋值true。则得到的jedis实例肯定是可以用的。
    private static Boolean testOnBorrow =
            Boolean.valueOf(PropertiesUtil.getProperty("redis.test.borrow", "true"));
    // return一个jedis实例时，是否进行验证操作，如果赋值true。则放回jedispool的jedis实例肯定是可以用的。
    private static Boolean testOnReturn =
            Boolean.valueOf(PropertiesUtil.getProperty("redis.test.return", "false"));

    private static String redisIp =
            String.valueOf(PropertiesUtil.getProperty("redis.ip"));

    private static Integer redisPort =
            Integer.valueOf(PropertiesUtil.getProperty("redis.port"));

    /**
     * 初始化连接池
     */
    private static void initPool() {
        JedisPoolConfig config = new JedisPoolConfig();

        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);

        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);

        // 连接耗尽时，是否阻塞，false则抛出异常，true则阻塞直到超时
        config.setBlockWhenExhausted(true);

        // 超时时间是 2 秒
        pool = new JedisPool(config, redisIp, redisPort, 1000 * 2);
    }

    static {
        initPool();
    }

    /**
     * 获取Redis连接
     * @return
     */
    public static Jedis getJedis() {
        return pool.getResource();
    }

    /**
     * 归还Redis连接
     * @return
     */
    public static void returnResource(Jedis jedis) {
        pool.returnResource(jedis);
    }


    /**
     * 归还无效Redis连接
     * @return
     */
    public static void returnBrokenResource(Jedis jedis) {
        pool.returnBrokenResource(jedis);
    }


    public static void main(String[] args) {
        Jedis jedis = pool.getResource();
        jedis.set("param", "testing1");
        returnResource(jedis);

        // 临时调用，销毁连接池中的所有连接
        pool.destroy();
        System.out.println("Running is end");
    }
}
